package tools

import (
	"fmt"
	"os"
	"path/filepath"
	"sort"
	"strings"
	"time"
)

// FileInfo 用于存储文件信息
type FileInfo struct {
	Path    string
	Name    string
	ModTime time.Time
}

// path := "C:\\Users\\Admin\\Pictures\\新建文件夹"
// prefix := "6079_"    // 自定义前缀
// targetExt := ".png"  // 指定目标后缀
// excludeExt := ".gif" // 排除的图片格式
func RenameFiles(path string, prefix string, targetExt string, excludeExt string) int {
	// 检查目录是否存在
	if _, err := os.Stat(path); os.IsNotExist(err) {
		fmt.Printf("目录不存在: %s\n", path)
		return 0
	}

	// 存储文件信息的切片
	var files []FileInfo

	// 遍历目录收集文件信息
	err := filepath.Walk(path, func(filePath string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		// 只处理文件，跳过目录
		if !info.IsDir() {
			files = append(files, FileInfo{
				Path:    filePath,
				Name:    info.Name(),
				ModTime: info.ModTime(),
			})
		}

		return nil
	})

	if err != nil {
		fmt.Printf("遍历目录时出错: %v\n", err)
		return 0
	}

	fmt.Printf("找到 %d 个文件\n", len(files))

	if len(files) == 0 {
		fmt.Println("目录中没有文件")
		return 0
	}

	// 按修改时间正序排序
	sort.Slice(files, func(i, j int) bool {
		return files[i].ModTime.Before(files[j].ModTime)
	})

	n := 0

	// 按排序后的顺序重命名文件
	for i, file := range files {
		// 获取文件的原始扩展名
		originalExt := filepath.Ext(file.Name)

		// 确定使用的扩展名
		var ext string
		if strings.ToLower(originalExt) == strings.ToLower(excludeExt) {
			// 如果是排除的扩展名，则保持原扩展名
			ext = originalExt
			fmt.Printf("检测到排除的文件类型 %s，保持原扩展名\n", file.Name)
		} else {
			// 否则使用指定的目标扩展名
			ext = targetExt
		}

		// 生成新的文件名，格式为 前缀+序号+目标扩展名
		newName := fmt.Sprintf("%s%02d%s", prefix, i+1, ext)
		newPath := filepath.Join(filepath.Dir(file.Path), newName)

		// 重命名文件
		err := os.Rename(file.Path, newPath)
		if err != nil {
			fmt.Printf("重命名文件失败: %s -> %s, 错误: %v\n", file.Path, newPath, err)
		} else {
			n++
			fmt.Printf("重命名成功: %s -> %s (修改时间: %s)\n", file.Path, newPath, file.ModTime.Format("2006-01-02 15:04:05"))
		}
	}
	return n
}
